package j16;

public class J16_Printer {

	public static void main(String[] args) {
		//인터 페이스 활용하기
		

	} //main

} //class

 class PrinterV2 {
	 
	 	private String 	model;
	 	private String 	maker;
	 	private String 	type;
	 	private int	 	paper;
	 	private int 	remains;
	 	
	 	//printer 클래스와 달리
	 	//메서드는 정의하지 않음
	 	//상속관계에 의해 부모 클래스의 메서드가
	 	//무시당할 것이므로 아예 만들지 않음
	 	
 }
 
 //모든 프린터가 기본적으로 제공해야 하는
 //표준 기능을 인터페이스로 작성
 
 interface PrinterV2Service {

	 void print();
	 
	 int showRemain();			//잔량 정보 표시
	 
 }
 
 //PrinterV2 클래스와 PrintV2service인터페이스를 이용해서
 //Inkjet, Laser 프린터 클래스를 작성
 
 class InkjetPrinterV2 extends PrinterV2 
	 implements PrinterV2Service {

	@Override
	public void print() {
		System.out.println("잉크젯 프린터입니다.");
		
	}

	@Override
	public int showRemain() {
		// TODO Auto-generated method stub
		return 100;
	}
 
 
 }
 
 class LaserPrintV2 extends PrinterV2
 	implements PrinterV2Service {

	@Override
	public void print() {
		System.out.println("레이저 프린터입니다.");
		
	}

	//레이저 프린터에서는 제공하지 않는 기능이지만
	//인터페이스를 구현했으므로
	//어쩔수 없이 ShowRemain 메서드를 재정의 해야한다.
	//즉, 필요없지만 약속에 의해 억지로 작성함
	@Override
	public int showRemain() {
		// TODO Auto-generated method stub
		return 0;
	}
	 
 }
 
 	//잉크젯,레이저 프린터 클래스를 작성하기 위해 
	//extends와 implements 예약어를 사용하는 것은
 	//복잡해 보이고 특정 클래스에서 사용하지 않는 메서드임에도 블구하고
 	//인터페이스 규칙상 작성해야 하는 불편함도 존재한다
 	//EX)Inkjet : print();, showRemain() 제공
 	//EX)Laser : print();만 제공
 	//때문에 이것을 간편하게 작성하기 위해
 	//기본 클래스 개념을 도입함!!
 
 interface PrinterV3Service{
	
	 void print();
	 int showRemain();
 }
 
 class PrinterV3 implements PrinterV3Service {
	 
	 	private String 	model;
	 	private String 	maker;
	 	private String 	type;
	 	private int	 	paper;
	 	private int 	remains;
		
	 	@Override
		public void print() {
			
			System.out.println("프린터 입니다.");
			
		}

		@Override
		public int showRemain() {
			
			return 0;
		}
 }
 
 class InkjetPrinterV3 extends PrinterV3 {
	
	 @Override
	public void print() {
	
		 System.out.println("잉크젯 프린터 입니다.");
	
		
		 
	}
	 @Override
	public int showRemain() {
		
		return 100;
	}
 }
 
 class LaserPrinterV3 extends PrinterV3 {
	 
	 @Override
	public void print() {
		
		 System.out.println("레이저 프린터 입니다.");
	}
 }
 
 	//기본 클래스를 도입해서
 	//잉크젯,레이저 프린터 클래스 작성시
 	//간편함을 알 수 있음
 	//또한, 인터페이스를 사용하더라도
 	//용도에 따라 메서드 재작성을 취사선택할 수 있다.
 